#!/bin/python3
#@版本号：v1.1
#@作者：橙子猫<bingfengfsx@qq.com>
#@许可证：GNU LGPL v3 or later
import time,sys
from pynput.keyboard import Key,Controller
#调用这个函数将会让程序遍历一遍字典，间隔为zd_time，文件路径zd_text。
class send_out:
    def __init__(self,nu,tx,ti,co):
        self.zd_number=nu
        self.zd_text=tx
        self.zd_time=ti
        self.zd_coding=co
    def zidian(self):
        k=Controller()
        f=open(self.zd_text,'r',encoding=self.zd_coding)
        n=0
        for i in f.readlines():
            #跳过字典里面的注释
            if '#' in i and i.index('#')==0:
                n+=1
                continue
            else:
                k.type(i.strip())
                time.sleep(self.zd_time/2)
                k.press(Key.enter)
                time.sleep(self.zd_time/2)
            n+=1
            print('第'+str(n)+'行')
        f.close()
    def bianli(self):
        #等待时间，足够用户切换窗口
        for t in range(5):
            print('即将开始轰炸，剩余时间：'+str(5-t)+'秒')
            time.sleep(1)
        try:
            for x in range(self.zd_number):
                print('第'+str(x+1)+'次遍历：')
                self.zidian()
        except FileNotFoundError as f_error:#如果文件找不到，执行此条。
            print('您输入的文件路径有误，请核对后再输入。\n')
        except PermissionError as p_error:#如果程序对文件没有读取权限，执行此条。
            print('您输入的文件无权访问，请调整文件的读取权限。\n')
        except UnicodeDecodeError as coding_error:
            print('您输入的文本编码方式有误，请核对后再输入。\n')
        except LookupError as l_error:
            print('错误：\n'+l_error+'请确认您输入的编码方式在Python解释器的支持范围内。\n')
        else:print('字典读取正常。\n')#如果文件可以正常读取，执行这一条。
        finally:pass#无论是否有报错都会执行到。
print('欢迎使用消息轰炸机\n程序版本：1.1-r2\n作者：橙子猫\n许可证：GNU LGPL v3 or later\n')
while True:
    #这里是程序运行的开头
    text1=str(input('请输入您要使用的字典：\n》'))
    textCoding=str(input('请输入字典的文本编码方式(例如：utf-8,gbk)：\n》'))
    time1=eval(input('请输入每秒想要攻击的次数：\n》'))
    num=eval(input('请输入您想要遍历几次字典：\n》'))
    time2=1.0/time1
    start=send_out(num,text1,time2,textCoding)
    start.bianli()
    lun=str(input('您是否还需要再次运行？<Y/n>\n或者直接按原设定再来一遍？<again/n>\n》'))
    if lun=='' or lun=='y' or lun=='Y':
        pass
    elif lun=='N' or lun=='n':
        break
    elif lun=='again' or lun=='Again' or lun=='AGAIN':
        start.bianli()
print('结束运行，时间：'+time.strftime('%Y-%m-%d，%H:%M:%S',time.localtime()))
time.sleep(3)
sys.exit(0)